home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / pao / towns / paolib / sample / type.c < prev    next >
Text File  |  1991-10-18  |  7KB  |  244 lines

  1. /** << High C >> **************************************************************
  2. **
  3. **    テキスト画面出力テストプログラム(INT23h/INT24h処理を含む)
  4. **
  5. **    < History >
  6. **    1991.03.06 : CREATE
  7. **    1991.05.07 : CTRL+C,致命的エラー時の処理追加。
  8. **
  9. **    < note > : TABS = 4
  10. **
  11. **    Programmed by Y.Hirata ( Nifty ID : NAB03321 )
  12. **
  13. ******************************************************************************/
  14.  
  15. pragma    Off (Floating_point) ;
  16.  
  17. #include <stdio.h>
  18. #include <dos.h>
  19. #include <msdos.cf>
  20. #include <egb.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <fmc.h>
  24. #include "hc.h"
  25. #include "key.h"
  26. #include <stdefs.h>
  27. #include "doserror.h"
  28.  
  29. #define    GworkSize    1536                /* グラフィック作業域のサイズ    */
  30. char    Gwork[GworkSize] ;                /* グラフィック作業域            */
  31.  
  32. /*******************************  致命的エラー処理  *****************************/
  33. static int critical_handler( unsigned di,unsigned ax )
  34. /*=============================================================================
  35. **    致命的エラーが発生した場合の処理をする.
  36. **
  37. **    < INPUT  > : di エラーコード(下位1バイトだけ有効)
  38. **               : ax 他のデバイスのエラーコード
  39. **    < OUTPUT > : なし
  40. **    < RETURN > : 致命的エラーに対する処置
  41. **
  42. **    ☆ 注意 ☆
  43. **     致命的エラー処理を行うハンドラでは、必ず次の値のいずれかを返り値とすること!
  44. **        INT24_IGNORE    0            (  無視                )
  45. **        INT24_RETRY        1            (  再試行            )
  46. **        INT24_ABORT        2            (  プログラム中止        )
  47. **        INT24_FAIL        3            (  ファンクションコール失敗    )
  48. **    ●実際には、再試行(INT24_RETRY)か取消(INT24_FAIL)のどちらかを返り値とした
  49. **     方がよい。無視(INT24_IGNORE)の場合には、その後の処理が保証されないし、
  50. **     中止(INT24_ABORT)の場合には、終了処理しないでプログラムが終了してしまうた
  51. **     めにOSに戻った後の処理が保証されないため。
  52. **    ●ただ単にマスクしたいのであれば、アクセス失敗という意味でINT24_FAILを返り値とす
  53. **     る。
  54. **    ●無条件に再試行をするようにする場合には、必ずwaitをいれるようにすること!
  55. =============================================================================*/
  56. {
  57.     register int    act ;
  58.     int        errcode ;
  59.     struct _ENCODE    encode ;
  60.     union _MOJI    moji ;
  61.  
  62. /*
  63. **    致命的エラー発生時のメッセージ表示
  64. */
  65.     TEXT_cr() ;
  66.     TEXT_color( C_WHITE ) ;
  67.     if ( (ax & 0x8000) == 0x8000 ) {
  68.         TEXT_printf( "↓のキャラクタデバイスにエラーの原因があります.\n" ) ;
  69.         switch ( ax & 0x000f ) {
  70.         case 1 :
  71.             TEXT_printf( "標準入力\n" ) ;
  72.             break ;
  73.         case 2 :
  74.             TEXT_printf( "標準出力\n" ) ;
  75.             break ;
  76.         case 4 :
  77.             TEXT_printf( "NULデバイス\n" ) ;
  78.             break ;
  79.         case 8 :
  80.             TEXT_printf( "クロックデバイス\n" ) ;
  81.             break ;
  82.         default :
  83.             TEXT_printf( "不明: AX = %xh\n",ax ) ;
  84.         }
  85.     } else {
  86.         TEXT_printf( "ブロックデバイス : FATのメモリイメージにエラーの原因があります.\n" ) ;
  87.     }
  88.     TEXT_cr() ;
  89.     /*  エラーコード表示    */
  90.     errcode = di & 0x00ff ;
  91.     if ( errcode > NDOSerr_code_msg || errcode < 0 ) {
  92.         errcode = NDOSerr_code_msg ;
  93.         TEXT_printf( "エラーコード(%d): %s\n",
  94.                 (di&0x00ff),DOSerr_code_msg[errcode] ) ;
  95.     } else {
  96.         TEXT_printf( "エラーコード(%d): %s\n",
  97.                 errcode,DOSerr_code_msg[errcode] ) ;
  98.     }
  99. /*
  100. **    致命的エラー発生時の詳細情報表示
  101. */
  102.     TEXT_cr() ;
  103.     TEXT_color( C_GREEN ) ;
  104.     /*  詳細情報 : 拡張エラーコード    */
  105.     errcode = INT24err.exterror ;
  106.     if ( errcode > NDOSerr_extcode_msg || errcode < 0 ) {
  107.         errcode = NDOSerr_extcode_msg ;
  108.         TEXT_printf( "拡張エラーコード(%2d): %s\n",
  109.                 INT24err.exterror,DOSerr_extcode_msg[errcode] ) ;
  110.     } else {
  111.         TEXT_printf( "拡張エラーコード(%2d): %s\n",
  112.                 errcode,DOSerr_extcode_msg[errcode] ) ;
  113.     }
  114.     /*  詳細情報 : エラークラス    */
  115.     errcode = INT24err.class ;
  116.     if ( errcode > NDOSerr_class_msg || errcode < 0 ) {
  117.         errcode = NDOSerr_class_msg ;
  118.         TEXT_printf( "  エラークラス (%2d): %s\n",
  119.                 INT24err.class,DOSerr_class_msg[errcode] ) ;
  120.     } else {
  121.         TEXT_printf( "  エラークラス (%2d): %s\n",
  122.                 errcode,DOSerr_class_msg[errcode] ) ;
  123.     }
  124.     /*  詳細情報 : エラーアクション    */
  125.     errcode = INT24err.action ;
  126.     if ( errcode > NDOSerr_action_msg || errcode < 0 ) {
  127.         errcode = NDOSerr_action_msg ;
  128.         TEXT_printf( "  エラー対処(%2d): %s\n",
  129.                 INT24err.action,DOSerr_action_msg[errcode] ) ;
  130.     } else {
  131.         TEXT_printf( "  エラー対処(%2d): %s\n",
  132.                 errcode,DOSerr_action_msg[errcode] ) ;
  133.     }
  134.     /*  詳細情報 : エラーローカス    */
  135.     errcode = INT24err.locus ;
  136.     if ( errcode > NDOSerr_locus_msg || errcode < 0 ) {
  137.         errcode = NDOSerr_locus_msg ;
  138.         TEXT_printf( "  エラー場所(%2d): %s\n",
  139.                 INT24err.locus,DOSerr_locus_msg[errcode] ) ;
  140.     } else {
  141.         TEXT_printf( "  エラー場所(%2d): %s\n",
  142.                 errcode,DOSerr_locus_msg[errcode] ) ;
  143.     }
  144. /*
  145. **    致命的エラーに対しどうするか?
  146. */
  147.     TEXT_color( C_HYELLOW ) ;
  148.     TEXT_printf( "\n<A>:中止, <R>:再試行, <I>:無視 ? " ) ;
  149.  
  150.     while ( TRUE ) {
  151.         moji.x = KYB_read( 0,(unsigned int *)&encode ) ;
  152.         if ( moji.hl.l == 'a' || moji.hl.l == 'A' ) {
  153.             act = INT24_ABORT ;
  154.             break ;
  155.         } else if ( moji.hl.l == 'r' || moji.hl.l == 'R' ) {
  156.             act = INT24_RETRY ;
  157.             break ;
  158.         } else if ( moji.hl.l == 'i' || moji.hl.l == 'I' ) {
  159.             act = INT24_IGNORE ;
  160.             break ;
  161.         }
  162.     }
  163.     TEXT_color( C_WHITE ) ;
  164.     TEXT_printf( "\n\n" ) ;
  165. /*
  166. **    致命的エラーに対する処理を設定する
  167. */
  168.     switch ( act ) {
  169.     case INT24_RETRY :
  170.     case INT24_ABORT :
  171.     case INT24_FAIL :
  172.         ax = ( ax & 0xFF00 ) + act ;
  173.         break ;
  174.     case INT24_IGNORE :
  175.         ax = ( ax & 0xFF00 ) + INT24_FAIL ;
  176.     }
  177.     return( ax ) ;
  178. }
  179.  
  180. /*********************************  初期化  **********************************/
  181. void ginit()
  182. {
  183.     TEXT_init( Gwork,GworkSize ) ;        /* EGB 初期化                        */
  184.     GRP_viewport( 0,0,1023,511 ) ;        /* View Port SET                    */
  185.     GRP_writePage( 1 ) ;
  186.     EGB_clearScreen( Gwork ) ;
  187.     EGB_displayPage( Gwork,0,3 ) ;        /* Show page 0 & 1 : Priority 0        */
  188.     TEXT_cursor( TRUE ) ;                /* カーソル表示                            */
  189.     TEXT_color( C_WHITE ) ;
  190. /*    TEXTcrflg = TRUE ;*/
  191. }
  192.  
  193. /*****************************  ★ メイン ★  ********************************/
  194. void main( int ac,char *av[] )
  195. {
  196.     struct _ENCODE    encode ;
  197.     union _MOJI    moji ;
  198.     FILE    *fp ;
  199.     char    buf[MAXCOLM+1] ;
  200.     int        c ;
  201.     int        err = FALSE ;
  202.  
  203.     ginit() ;                                /* EGB 初期化                */
  204.  
  205.     INT24_entry = critical_handler ;
  206.     INT24_init() ;                            /*  INT23h/INT24h設定        */
  207.  
  208.     if ( ac > 1 ) {                /*  引数あり    */
  209.         if ( (fp=fopen( av[1],"r" )) == NULL ) {
  210.             TEXT_printf( "can't open input file : %s\n",av[1] ) ;
  211.             err = TRUE ;
  212.         }
  213.     } else {                    /*  引数なし    */
  214.         TEXT_printf( "データファイル名を指定して下さい!\n" ) ;
  215.         err = TRUE ;
  216.     }
  217.  
  218.     if ( !err ) {
  219.         TEXTtabs = 4 ;
  220.         TEXT_color( C_HGREEN ) ;
  221.         TEXT_printf( "FILE: %s\n",av[1] ) ;
  222.         TEXT_color( C_WHITE ) ;
  223.         c = 0 ;
  224.         while ( fgets(buf,sizeof(buf),fp) != NULL ) {
  225.             c ++ ;
  226.             TEXT_printf( "%s",buf ) ;
  227.         }
  228.         TEXT_printf( "[EOF]\n\n全部で %d 行のデータを読みました.\n",c ) ;
  229.         fclose( fp ) ;
  230.     }
  231.  
  232.     KYB_clrbuf() ;                            /*  バッファクリア            */
  233.     TEXT_color( C_HGREEN ) ;
  234.     TEXT_printf( "\n何かキーを押して下さい。 " ) ;
  235.     moji.x = KYB_read( 0,(unsigned int *)&encode ) ;
  236. /*
  237. **    コンソール画面に戻す
  238. */
  239.     EGB_init( Gwork,GworkSize ) ;         /*  ゴミを消すため EGB 初期化        */
  240.     EGB_clearScreen( Gwork ) ;
  241.     coninit() ;
  242. }
  243.  
  244.